package com.fdb.efp.nls.service.dao;

import com.fdb.efp.nls.service.domain.AccLoan;
import com.fdb.efp.nls.service.vo.AccLoanStatisticalInfo;
import com.fdb.efp.nls.service.vo.AccLoanVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * DAO interface:贷款台账
 * <p>
 * 
 * @author chenqm1
 * @date 2018-05-03
 */
public interface AccLoanDao {

	public int insertAccLoan(AccLoan accLoan);

	public int deleteByPk(AccLoan accLoan);

	public int updateByPk(AccLoan accLoan);

	public int batchUpdate(List<AccLoan> list);

	public AccLoan queryByPk(AccLoan accLoan);

	public List<AccLoan> queryAllOwnerByPage(AccLoanVO accLoanVO);

	public List<AccLoan> queryAllCurrOrgByPage(AccLoanVO accLoanVO);

	public List<AccLoan> queryAllCurrDownOrgByPage(AccLoanVO accLoanVO);

	public List<AccLoan> queryAllCurrOwnerPrdByPage(AccLoanVO accLoanVO);

	// 根据条件查询台账信息
	public AccLoan querySigleAccLoanByCondition(AccLoan accLoan);

	// 查询合同下所有未结清借据
	public List<AccLoan> queryAllByCont(AccLoanVO accLoanVo);

	public List<AccLoan> queryAllContNo(String contNo);

	public AccLoan queryBillNoByLoanAccount(AccLoan accLoan);

	// 查询经过人工认定的最高风险分类等级
	public AccLoan queryByManualIdt(AccLoan accLoan);

	// 查询未经过人工认定的最高风险分类等级
	public AccLoan queryBySevenResult(AccLoan queryAccLoan);

	// 查询未结清的借据信息
	public List<AccLoan> queryListByAccStatus(AccLoan accLoan);

	public List<AccLoan> queryOverdueDaysByPage(AccLoanVO accLoanVO);

	// 查询客户类型为农户的借据信息
	public List<AccLoan> queryListFatmer();

	// 查询客户类型为非农的借据信息
	public List<AccLoan> queryListOther();

	/**
	 * 分批查询贷款台账信息，供批次生成文件
	 * 
	 * @param start
	 *            数据开始
	 * @param end
	 *            数据结束
	 * @return List<AccLoan>
	 */
	public List<AccLoan> queryAllLoanInTurn(int start, int end);

	/**
	 * 获取表数据总数
	 * 
	 * @return
	 */
	public int queryLoanCount(AccLoan accLoan);

	/**
	 * 根据条件获取表数据总数
	 * 
	 * @return
	 */
	public int queryLoanCountByCond(AccLoan accLoan);

	// 贷款台账客户移交
	public int loanAppCusHandOver(@Param("fromUser") String fromUser, @Param("toUser") String toUser, @Param("fromBrId") String fromBrId,
                                  @Param("toBrId") String toBrId, @Param("cusIds") List<String> cusIds);

	/**
	 * 根据条件查询台账集合信息
	 *
	 * @param Map
	 * @return
	 */
	public List<AccLoan> queryListByAcctDateAndLimit(Map<String, Object> map);

	// 未结清的合同号
	public List<String> queryContListByAccStatus();

	// 未结清借据列表
	public List<String> queryBillListByAccStatus(AccLoan accLoan);

	/**
	 * 根据合同编号列表查询借据明细(贷款台账)
	 *
	 * @param contNos
	 * @return
	 */
	public List<AccLoanVO> queryAccLoanByContNos(@Param("list") List<String> contNos);

	// 未结清的客户
	public List<AccLoan> queryCusIdListByAccStatus();

	/**
	 * 根据贷款账号列表查询借据明细(贷款台账)
	 *
	 * @param acctList
	 *            :贷款账号list
	 * @return
	 */
	public List<AccLoan> queryListByAcct(@Param("list") List<String> acctList);

	public void updateCollInfoByPk(AccLoan accLoan);

	// 根据法人机构号 查询目前放款占用额度
	public BigDecimal queryLoanBalanceByLegalOrgCode(AccLoan accLoan);

	/**
	 * 查询小于会计日的台账条数
	 */
	public int queryLoanCountByAcctDate(AccLoan accLoan);

	public List<AccLoan> queryAllLoanByAcctDate(Map<String, Object> map);

	/**
	 * 根据借据号更新台账状态
	 *
	 * @param billNos
	 * @param accountStatus
	 * @return
	 */
	public int updateAccountStatusByBillNos(@Param("billNos") List<String> billNos, @Param("accountStatus") String accountStatus);

	/**
	 * 更新借据余额
	 *
	 * @param billNos
	 * @return
	 */
	public int updateAccLoanBalanceByBillNos(@Param("billNos") List<String> billNos);

	/**
	 * 获取未结清的台帐信息
	 *
	 * @return
	 */
	public List<AccLoan> queryListAll();

	// 查询合同第一笔发放贷款的日期
	public AccLoan queryByfirstDisbDate(AccLoan queryAccLoan);

	/**
	 * 条件查询台账列表
	 *
	 * @param accLoanVO
	 * @return
	 */
	public List<AccLoan> queryAccLoanListByCondition(AccLoanVO accLoanVO);

	// 风险分类岗查询所属本人数据
	public List<AccLoan> queryByRscCurrDownOrgByPage(AccLoanVO accLoanVo);

	// 风险分类岗查询所属机构数据
	public List<AccLoan> queryByRscCurrOrgByPage(AccLoanVO accLoanVo);

	// 风险分类岗查询所属机构及下属机构数据
	public List<AccLoan> queryByRscOwnerByPage(AccLoanVO accLoanVo);

	public List<AccLoan> queryListByStatus(@Param("billNoList") List<String> billNoList);

	public List<AccLoan> queryListByOvertimes(@Param("billNoList") List<String> billNoList);

	/**
	 * 根据借据编号List查借据数据
	 *
	 * @param billNos
	 * @return
	 */
	public List<AccLoan> queryByBillNos(@Param("billNos") List<String> billNos);

	// 查询合同底下非正常的借据信息（七级分类为次级、可疑、损失）
	public List<AccLoan> queryBadResultByContNo(String contNo);

	/**
	 * 主动催收申请表
	 *
	 * @param accLoan
	 * @return
	 */
	public List<AccLoan> queryColtAutoApp(AccLoanVO accLoan);

	// 催收任务最大本金逾期日期
	public AccLoan queryMinByCapOverdueDate(@Param("billNoList") List<String> billNoList);

	// 催收任务最大利息逾期日期
	public AccLoan queryMinByIntOverdueDate(@Param("billNoList") List<String> billNoList);

	// 催收任务最高逾期期数
	public AccLoan queryFirstByMaxTimesTotal(@Param("billNoList") List<String> billNoList);

	// 催收任务最高七级风险分类结果
	public AccLoan queryFirstBySevenResult(@Param("billNoList") List<String> billNoList);

	// 4.12.10 自动生成法务出催提醒
	public List<AccLoan> queryLegalForOutWithStatus(@Param("billNos") List<String> billNos);

	public List<AccLoan> queryLegalForOutWithOverTime(@Param("billNos") List<String> billNos);

	/**
	 * 查询台账所有数据
	 *
	 * @return List<AccLoan>
	 */
	public List<AccLoan> queryAllAccLoan();

	/**
	 * 统计需要七级分类的借据数据
	 *
	 * @return
	 */
	public List<String> queryCusIds4SevenClassify();

	/**
	 * 获取需要七级分类的借据列表数据
	 *
	 * @param cusIds
	 * @return
	 */
	public List<AccLoan> queryAccLoanList4SevenClassifyByCusIds(@Param("cusIds") List<String> cusIds);

	public void batchUpdateAccLoanFromMaTxt();

	public AccLoan queryBRR(AccLoan accLoan);

	 /**
	 *
	 * 日初借据信息临时表数据到借据信息表有数据则更新，无则新增 <br>
	 * 0.1:weijj:2019年5月7日 下午2:37:18:新增 <br>
	 *
	 * @author weijj
	 * @since 2019年5月7日 下午2:37:18
	 * @date 2019年5月7日 下午2:37:18
	 * @version 0.1
	 */
	public int insertOrUpdateAccLoan(List<AccLoan> list);
//	public List<AccLoan> queryBRR(AccLoanVO accLoanVO);

	public List<AccLoan> queryPersonlLoanInfo(AccLoanVO accLoanVO);

	public AccLoan querySinglePersonlLoanInfo(AccLoanVO accLoanVO);
//
//	/**
//	 * 需求编号：【2019D0519】（业务提的需求编号）
//	 * 问题编号：【xxxxxxx】（若不是因为修复问题而新增该类，则留空）
//	 * 开发人员：qiuyf
//	 * 创建日期：2019年5月22日 下午3:20:02
//	 * 功能描述：根据证件类型、证件号码统计台账状态不为“结清 3”
//	 */
//	@author:liuty
//	@date:2019/10/17
//	涉及产品:税e贷
//	功能:根据证件类型、证件号码统计台账状态不为“结清 3”
//	原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//	public int countAccStsNotSetledByCust(AccLoan accLoan);

	public List<AccLoan> queryLoanInfoByBizDate(String openDay);
//
//	/**
//	 * 通过授信申请流水号列表查询借据信息: <br>
//	 *
//	 * 0.1:caoxin:2019/5/22 19:08: TODO: <br>
//	 * @author caoxin
//	 * @return
//	 * @since 2019/5/22 19:08
//	 * @date 2019/5/22 19:08
//	 * @version 0.1
//	 */

	List<AccLoan> queryByApplySqes(@Param("ids") List<String> ids);
//
//	/**
//	 * 根据产品列表查询借据数据
//	 *
//	 * @param prdInfoVOS
//	 * @return
//	 */
//	@author:liuty
//	@date:2019/10/17
//	涉及产品:税e贷
//	功能:根据产品列表查询借据数据
//	原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//	List<AccLoan> queryIncrementalData(@Param("prdInfoVOS") List<PrdInfoVO> prdInfoVOS, @Param("batchDate") String batchDate);
//	/**
//	 * 需求编号：2019D0519<br/>
//	 * 问题编号：<br/>
//	 * 功能描述：通过创建时间模糊查询（最新更新时间为空）或最近更新时间模糊查询所有当天所有借据记录<br/>
//	 * 开发人员：周才顺<br/>
//	 * 创建时间：2019年5月27日 下午7:29:57<br/>
//	 * @author zhoucs1
//	 * @since  1.0
//	 * @version 1.0
//	 * @param accLoanVO
//	 * @return
//	 */
//	@author:liuty
//	@date:2019/10/17
//	涉及产品:税e贷
//	功能:通过创建时间模糊查询（最新更新时间为空）或最近更新时间模糊查询所有当天所有借据记录<br/>
//	原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//	public List<AccLoan> queryAllByCurrentDate(AccLoanVO accLoanVO);
//
//	public int batchUpdateCusManage(@Param(value = "sedSynCusManageVO")List<SedSynCusManageVO> sedSynCusManageVO);
//
//
//	/**
//	 * 需求编号：2019D0519<br/>
//	 * 问题编号：<br/>
//	 * 功能描述：通过年份去查询当年的所有借据记录<br/>
//	 * 开发人员：周才顺<br/>
//	 * 创建时间：2019年6月26日<br/>
//	 * @author zhoucs1
//	 * @since  1.0
//	 * @version 1.0
//	 * @param year
//	 * @return
//	 */
//	@author:liuty
//	@date:2019/10/17
//	涉及产品:税e贷
//	功能:通过年份去查询当年的所有借据记录<br/>
//	原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//	public List<AccLoan> queryListByYear(@Param(value = "createTime") String year);
//
//	/**
//	 * 需求编号：2019D0519<br/>
//	 * 问题编号：<br/>
//	 * 功能描述：查询批次日期当天五级分类标志发生了变动的借据记录<br/>
//	 * 开发人员：周才顺<br/>
//	 * 创建时间：2019年6月26日<br/>
//	 * @author zhoucs1
//	 * @since  1.0
//	 * @version 1.0
//	 * @param batchDate
//	 * @param prdId
//	 * @return
//	 */
//	@author:liuty
//	@date:2019/10/17
//	涉及产品:税e贷
//	功能:查询批次日期当天五级分类标志发生了变动的借据记录<br/>
//	原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//	public List<AccLoan> queryListFiveLevelChangeCurDate(@Param(value = "claDate") String batchDate,@Param(value = "prdId") String prdId);
//

	/**
	 * 插入或者更新借据信息: <br>
	 * 0.1:caoxin:2019/7/10 10:43: <br>
	 *
	 * @return
	 * @author caoxin
	 * @date 2019/7/10 10:43
	 * @version 0.1
	 * @since 2019/7/10 10:43
	 */

	int insertOrUpdateByPk(AccLoan accLoan);
//
//	/**
//	 * 需求编号：2019D0519<br/>
//	 * 问题编号：<br/>
//	 * 功能描述：查询截止到批次日期发生的所有税E贷的借据记录<br/>
//	 * 开发人员：周才顺<br/>
//	 * 创建时间：2019年7月10日<br/>
//	 * @author zhoucs1
//	 * @since  1.0
//	 * @version 1.0
//	 * @param sub_data_date
//	 * @return
//	 */
//	@author:liuty
//	@date:2019/10/17
//	涉及产品:税e贷
//	功能:查询截止到批次日期发生的所有税E贷的借据记录<br/>
//	原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//	public List<PlsAccLoanVO> queryAllRptSedAccLoan(@Param(value = "batchDate") String sub_data_date, @Param(value = "prdId") String prdId);
//
//	/**
//	 * 需求编号：2019D0519<br/>
//	 * 问题编号：<br/>
//	 * 功能描述：查询所有税E贷中到批次日期发生的未结清的借据记录<br/>
//	 * 开发人员：周才顺<br/>
//	 * 创建时间：2019年7月11日<br/>
//	 * @author zhoucs1
//	 * @since  1.0
//	 * @version 1.0
//	 * @param sub_data_date
//	 * @param prdId
//	 * @return
//	 */
//	@author:liuty
//	@date:2019/10/17
//	涉及产品:税e贷
//	功能:查询所有税E贷中到批次日期发生的未结清的借据记录<br/>
//	原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//	public List<AccLoan> queryAllOpenBill(@Param(value = "batchDate") String sub_data_date,@Param(value = "prdId") String prdId);
//
//	public AccLoan queryByApplSeq(@Param("applSeq") String applSeq);
//
//	public int updateByApplySeq(AccLoan accLoan);

	/**
	 * 问题编号：<br/>
	 * 功能描述：根据证件类型和证件号码查询借据表<br/>
	 * 创建时间：2019年8月19日<br/>
	 * @param accLoanVO
	 * @return
	 */
	public List<AccLoan> queryAccLoanByPage(AccLoanVO accLoanVO);

	public AccLoan queryOneAccLoanData(@Param("applySeq") String applySeq);

	/**
	 * 开发人员：【chenxuan】
	 * 创建/修改日期：【2019/8/8】
	 * 修改描述：查询网贷借据余额
	 * @Param [list]
	 * @return int
	 **/
	public BigDecimal queryPreOccAmt(AccLoan accLoan);

    /**
     * 状态新增了 14-非应计
     * @param accLoan
     * @return
     */
    public BigDecimal queryPreOccAmt2(AccLoan accLoan);

	public String queryMaxBizdate(Map<String, String> paramMap);

	public AccLoan queryDbllInfo(@Param("billNo") String billNo);

	public List<AccLoan> batchQuerybyCert(@Param("certTypes") List<String> certTypes, @Param("certCodes") List<String> certCodes);

	/**
	 * 需求编号:2019D08--
	 * 问题编号:
	 * 开发人员: caoxin
	 * 创建日期:2019/10/9
	 * 功能描述:根据证件号码查询正常为 1,逾期为 10 并且 信息担保 00的贷款余额
	 * 修改日期:2019/10/9
	 * 修改描述:
	 */
	List<AccLoan> queryLoanByCertCodeAndStatusAndAssure(@Param("certCode") String certCode, @Param("certType") String certType);

	public String queryPrdId(@Param("billNo") String billNo);

	List<AccLoanStatisticalInfo> queryAccLoanStatisticalInfos(@Param("billNos") List<String> billNos);

	List<AccLoan> queryByCertCode(@Param("certCode") String certCode);

    int insertOrUpdatePsd(List<AccLoan> list);

	int batchInsert(List<AccLoan> list);

    int countLossCreditByCusId(@Param("cusId") String cusId);

	/*
	 * 根据借据号查询贷款号和发放号
	 *
	 */
	public AccLoan queryLSAndDNByPK(@Param("billNo") String billNo);

	List<AccLoan> queryByCertCodeAndPrdId(@Param("certCode") String certCode, @Param("prdId") String prdId);


    public AccLoan queryOverdue(@Param("certType") String certType, @Param("certCode") String certCode);

	public List<AccLoan> queryByCertandPrd(AccLoan accLoan);

	public List<AccLoan> queryByCertAndPrdByPage(AccLoan accLoan);

    public AccLoan queryByPrdIdAndApplySeq(AccLoan accloan);

	public AccLoan queryByApplySeq(AccLoan accLoan);

	// 查询合同第一笔发放贷款的日期
	public AccLoan queryfirstDisbDateByCond(AccLoan queryAccLoan);
}